home *** CD-ROM | disk | FTP | other *** search
/ Video Toaster 4.0 / Video Toaster v4.0.iso / programs / documentation / modelerarexx.doc < prev    next >
Text File  |  1994-06-28  |  21KB  |  644 lines

  1.  
  2. MODELER AREXX INTERFACE
  3. =======================
  4. Updated 6/21/94
  5.  
  6.  
  7. Modeler operates as a function host for function calls only.
  8. "LWModelerARexx.port" is the function host address.
  9.  
  10.  
  11. FUNCTION ARGUMENTS
  12.  
  13. Function arguments and return values are generally one of the fixed 
  14. set of types whose formats are listed below, although values may be
  15. formatted in a specific way for some functions.  The standard formats
  16. are shown here:
  17.  
  18.     number    -- a floating point or integer number.
  19.  
  20.             examples:    12  -99   0  1.23  -.5601  1.667e-3
  21.  
  22.     bool    -- a number where 0 is false and anything else is true
  23.            (usually 1).
  24.  
  25.     vector    -- a triple of floating point numbers separated by spaces, 
  26.            or a single number.  A single number is interpreted as
  27.            a vector with all three components the same.
  28.  
  29.             examples:    1 1 -1      .5 -12.6 0      0 -15 -13
  30.             example:    2 and 2 2 2 give the same vector
  31.  
  32.     string    -- raw argument text
  33.  
  34.     keyword    -- one of several possible keywords, shown as <a|b|c...>
  35.            Only enough of a keyword need be specified to 
  36.            distinguish it from the other possibilities.
  37.  
  38.             example:    axis <X|Y|Z>
  39.  
  40.     flags    -- a string that can contain any of a set of characters,
  41.            shown as <a;b;c>.  If the character is present in the
  42.            string, the flag it represents is set.  Likewise, if
  43.            the character is not present the flag is clear.
  44.  
  45.             example:    ease <i;o>
  46.  
  47.     layers    -- a list of one or more layer numbers in the range 1-8.
  48.  
  49.  
  50. INTERFACE MODES and STATES
  51.  
  52. The client ARexx interface has modes and states in which it operates. 
  53. Some commands are only valid in some modes, and some are valid in any
  54. mode.  An attempt to use a command when the interface is in the wrong mode 
  55. will generate an error.
  56.  
  57.     NORMAL mode.  This is the default mode, and the one the interface 
  58.     starts in.  Most single-function commands are valid in this mode.
  59.  
  60.     ADD mode.  Started with ADD_BEGIN and exited with ADD_END.  Only
  61.     the "add" data creation commands are allowed in this mode.
  62.  
  63.     TRANSFORM mode.  Started with XFRM_BEGIN and ended with XFRM_END.
  64.     Only "xfrm" coordinate trasform commands are allowed in this mode.
  65.  
  66.     REPLICATE mode.  Started with REPL_BEGIN and ended with REPL_END.
  67.     Only replication step commands are allowed in this mode.
  68.  
  69. Any of the above modes will also be terminated with a BEGIN command for
  70. another of the modes, or the END_ALL command.
  71.  
  72. In addition to these mutually-exclusive modes, there is the REQUESTER
  73. state, which is used to build and display a requester to the user for 
  74. input.  This additional mode is entered and exited with REQ_BEGIN and 
  75. REQ_END commands.  The "req" requester commands are only valid in 
  76. REQUESTER state, but other commands, including the mode change commands 
  77. above are valid regardless of REQUESTER state.
  78.  
  79. Certain selection functions are only valid in USER selection mode.  See
  80. the section on selection below.
  81.  
  82.  
  83. FUNCTION SUMMARY
  84.  
  85. Parameter types are shown in <>'s.  Trailing arguments which are 
  86. optional are shown in [], where any number of tailing arguments can
  87. be omitted.
  88.  
  89. General:
  90.  
  91.     NEW()
  92.          -- Clear all data.
  93.  
  94.     EXIT()
  95.          -- Return to LightWave layout.  There can be no commands after
  96.         this one.
  97.  
  98.     UNDO()
  99.          -- Restore data from last change.
  100.  
  101.     DELETE()
  102.          -- Delete contents of current layers.
  103.  
  104.     CUT()
  105.          -- Cut current layers to paste buffer.
  106.  
  107.     COPY()
  108.          -- Copy current layers to paste buffer.
  109.  
  110.     PASTE()
  111.          -- Copy paste buffer to current layer.
  112.  
  113.  
  114. File I/O:
  115.  
  116.     LOAD(filename<string>)
  117.          -- Load data from LightWave file into current layer.
  118.  
  119.     SAVE(filename<string>)
  120.          -- Store data from current layers into LightWave file.
  121.  
  122.  
  123. State:
  124.  
  125.     SETLAYER(<layers>)
  126.     SETBLAYER(<layers>)
  127.          -- Switch active or background layers to show given list.
  128.  
  129.     SURFACE(name<string>)
  130.          -- Set current surface to given name.  If it does not
  131.         exist it will be created.
  132.  
  133.     END_ALL()
  134.          -- Set mode to NORMAL regardless of current mode, and
  135.         terminate REQUESTER state, if active.  This is done
  136.         automatically when a script initiated from Modeler
  137.         completes.
  138.  
  139.  
  140. Point Transforms:
  141.  
  142. The "Flex" and "Deform" transformations use similar region data to define
  143. the scope of their operations.  These are set globally and then applied
  144. to all trasformations of a given type.
  145.  
  146.     FIXEDFLEX(axis<X|Y|Z>, start<number>, end<number>, [ease<i;o>])
  147.          -- Set the flex functions to operate on a fixed range
  148.         along an axis.  Ease flags are 'i' for ease-in and 'o'
  149.         for ease-out.
  150.  
  151.     AUTOFLEX(axis<X|Y|Z>, direction<+|->, [ease<i;o>])
  152.          -- Set the flex functions to operate on an automatic range 
  153.         along an axis of the given polarity.
  154.  
  155.     DEFORMREGION(radius<vector>, [center<vector>, axis<X|Y|Z>])
  156.          -- Set the area of effect for the deformation tools.  If
  157.         axis is omitted, the effect is bounded in all 
  158.         directions by the given radius.  If an axis is 
  159.         specified, the effect is unbounded along that axis.
  160.  
  161.     MOVE  (offset<vector>)
  162.     SHEAR (offset<vector>)
  163.     MAGNET(offset<vector>)
  164.          -- Translate points by the given offset.  Shear translates
  165.         along the flex axis.  Magnet translates in the deform
  166.         region.
  167.  
  168.     ROTATE(angle<number>, axis<X|Y|Z>, [center<vector>])
  169.     TWIST (angle<number>, axis<X|Y|Z>, [center<vector>])
  170.     VORTEX(angle<number>, axis<X|Y|Z>, [center<vector>])
  171.          -- Rotate points along the given axis by the angle given
  172.         in degrees.  Twist uses the flex axis, and vortex uses
  173.         the deform region.
  174.  
  175.     SCALE(factor<vector>, [center<vector>])
  176.     TAPER(factor<vector>, [center<vector>])
  177.     POLE (factor<vector>, [center<vector>])
  178.          -- Scale points by the given factors around the given
  179.         center.  Taper uses the flex axis, and pole uses the
  180.         deform region.
  181.  
  182.     BEND(angle<number>, direction<number>, [center<vector>])
  183.          -- Bend points by the given bend angle in the direction
  184.         around the optional center.  This function uses the 
  185.         current flex axis.
  186.  
  187.     JITTER(radius<vector>)
  188.          -- Randomly translate points within a given box.
  189.  
  190. (new)    JITTER(radius<vector>, [type<GAUSSIAN|UNIFORM|NORMAL|RADIAL>,
  191.                 center<vector>])
  192.          -- Randomly translate points using different displacement
  193.         functions.  UNIFORM is the default, which is the same
  194.         as the old box jitter.  GAUSSIAN distributes the offsets
  195.         in a bell curve around the start point.  NORMAL shifts
  196.         the points in and out along the local surface normal.
  197.         RADIAL shifts points in and out along a line through
  198.         a central point given by center.
  199.  
  200.     SMOOTH([iterations<number>, strength<number>])
  201.          -- Apply smoothing function to attempt to remove kinks in
  202.         polygons connecting affected points.
  203.  
  204.     QUANTIZE(size<vector>)
  205.          -- Snap all points to a 3D grid defined by the size vector.
  206.  
  207.     MERGEPOINTS([mindist<number>])
  208.          -- Merge points lying within a certain minimum distance of
  209.         each other.  If no distance is given, it is computed
  210.         automatically.
  211.  
  212.  
  213. Object Creation:
  214.  
  215.     MAKEBOX(lowcorner<vector>, highcorner<vector>, [nsegments<vector>])
  216.          -- Make a box with the given extent and divisions.
  217.  
  218.     MAKEBALL(radius<vector>, nsides<int>, nsegments<int>, [center<vector>])
  219.          -- Make a globe-style sphere.
  220.  
  221.     MAKETESBALL(radius<vector>, level<int>, [center<vector>])
  222.          -- Make a tesselated sphere.
  223.  
  224.     MAKEDISC(radius<vector>, top<number>, bottom<number>, axis<X|Y|Z>,
  225.          nsides<int>, [nsegments<int>, center<vector>])
  226.          -- Make a disc.
  227.  
  228.     MAKECONE {same as disc}
  229.          -- Make a cone.  Top is the pointy end.
  230.  
  231.  
  232. Text:
  233.  
  234.     index<number> = FONTLOAD(filename<string>)
  235.          -- Load the given font file into the font list.  Returns 
  236.         the font index in the table if loaded sucessfully, zero 
  237.         otherwise.
  238.  
  239.     count<number> = FONTCOUNT()
  240.          -- Get number of fonts loaded.
  241.  
  242.     index<number> = FONTINDEX(name<string>)
  243.          -- Get index for name.
  244.  
  245.     name<string> = FONTNAME(index<number>)
  246.          -- Get name for index.
  247.  
  248.     width<number> = MAKETEXT(text<string>, index<number>,
  249.                  [cornertype<SHARP|BUFFERED>, spacing<number>,
  250.                   scale<number>, axis<X|Y|Z>, pos<vector>])
  251.          -- Generate text using the given font index.  Returns width
  252.         as computed from the font metrics.  Spacing is an additional 
  253.         distance to put between characters (normally 0).  Scale is
  254.         a scale factor (or approximate size in meters).  Axis and
  255.         pos define the position of the first character and the plane
  256.         in which the text will lie.
  257.  
  258.  
  259. Query Functions:
  260.  
  261.     active<layers> = CURLAYER()
  262.          -- Returns current active layer numbers.
  263.  
  264.     background<layers> = CURBLAYER()
  265.          -- Returns current background layer numbers.
  266.  
  267.     empty<layers> = EMPTYLAYERS()
  268.          -- Returns numbers of empty layers.
  269.  
  270.     name<string> = CURSURFACE()
  271.          -- Returns current surface name.
  272.  
  273.     boxdata = BOUNDINGBOX([test<layers>])
  274.          -- Returns bounding box information for the given layers or the
  275.         current layers if none given.  Bounding box is a string:
  276.  
  277.             num x0 x1 y0 y1 z0 z1
  278.  
  279.         num is number of points tested.  If 0, the remaining values
  280.         are also zero.  The remaining values are the low and high
  281.         in the three axes -- 0 is low, 1 is high.
  282.  
  283.  
  284. Additional:
  285.  
  286.     LATHE(axis<X|Y|Z>, nsides<int>,
  287.           [center<vector>, endangle<number>, startangle<number>])
  288.          --    Spin template around axis.
  289.  
  290.     EXTRUDE(axis<X|Y|Z>, extent<number>, [nsegments<int>])
  291.          --    Sweep template along axis.
  292.  
  293.     MIRROR(axis<X|Y|Z>, plane<number>)
  294.          -- Copy selected data, fliping it through a plane.
  295.  
  296.     PATHCLONE(...)
  297.     PATHEXTRUDE(filename<string>, [step<number>,
  298.             start<number>, end<number>])
  299.          -- Load the motion file and extrude or clone selected data
  300.         according to path interval settings.
  301.  
  302.     RAILCLONE(...)
  303.     RAILEXTRUDE(segments<number>, [divs<KNOTS|LENGTHS>, flags<o;s>,
  304.             strength<number>])
  305.          -- Clone or extrude selected data using rails in background
  306.         layers.  If segments is zero, they are computed automatically,
  307.         otherwise it is a fixed division.  Flags are 'o' for 
  308.         oriented and 's' for scaled.
  309.  
  310.     AXISDRILL(operation<CORE|TUNNEL|SLICE|STENCIL>, axis<X|Y|Z>,
  311.           [surface<string>])
  312.          -- Use background layers as template to operate on foreground 
  313.         layers.  Surface is used for STENCIL operation.
  314.  
  315.     SOLIDDRILL(operation<CORE|TUNNEL|SLICE|STENCIL>, [surface<string>])
  316.          -- Use background object to operate on foreground.
  317.  
  318.     BOOLEAN(operation<UNION|SUBTRACT|INTERSECT|ADD>)
  319.          -- Combine background object with foreground data.
  320.  
  321.     BEVEL(inset<number>, shift<number>)
  322.          -- Perform bevel operation on selected polygons.
  323.  
  324.     SHAPEBEVEL(pattern)
  325.          --    Bevel with a shape defined by a series of insets and
  326.         shifts.  The pattern is a blank-separated list of 
  327.         inset/shift pairs, each relative to the original polygon.  
  328.         The same effect can be achieved using iterative bevels, 
  329.         but the results are not always correct because of self-
  330.         crossing.
  331.  
  332.     SMOOTHSHIFT(offset<number>, [maxangle<number>])
  333.          -- Shift selected polygons by given offset.  Any angles 
  334.         greater than maxangle will cause the surface to break.
  335.  
  336.     FLIP()
  337.          -- Flip sidedness of faces, direction of curves.
  338.  
  339.     TRIPLE()
  340.          -- Convert all polygons into triangles.
  341.  
  342.     REMOVEPOLS()
  343.          -- Remove polygons leaving points.
  344.  
  345.     ALIGNPOLS()
  346.          -- Flip polygons so all are facing the same direction (as
  347.         much as is possible).
  348.  
  349.     UNIFYPOLS()
  350.          -- Delete any duplicate polygons.
  351.  
  352.     CHANGESURFACE(surface<string>)
  353.          -- Set the surface of all selected polygons.
  354.  
  355.     SUBDIVIDE(mode<FLAT|SMOOTH|METAFORM>, [maxangle<number>])
  356.          -- Split all triangles into four smaller triangles.
  357. (new)        Also splits quads into four smaller quads.  Metaform
  358.         option uses the metaform algorithm.
  359.  
  360. (new)    FRACSUBDIVIDE(mode<FLAT|SMOOTH|METAFORM>, fractal<number>,
  361.               [maxangle<number>])
  362.          -- Same as subdivide, but applies a fractal displacement
  363.         to each new vertex as a function of its position.
  364.  
  365.     FREEZECURVES()
  366.          -- Convert all selected curves directly into polygons.
  367.  
  368.  
  369. Data Creation (ADD mode):
  370.  
  371.     ADD_BEGIN()
  372.          -- Enter data creation (ADD) mode.  Points and polygons
  373.         can be added.  Other operations are illegal except 
  374.         for the SURFACE command which sets surface for new 
  375.         polygons.
  376.  
  377.     index<int> = ADD_POINT(position<vector>)
  378.          -- Points are numbered in creation order starting at 1.
  379.         The index of the new point is returned.
  380.  
  381.     ADD_POLYGON(<point number list>)
  382.          -- Takes a variable number of point numbers as argument.
  383.         Polygon is created using current default surface.
  384.  
  385.     ADD_QUAD(<point number list>)
  386.          -- Takes a variable number of point numbers, up to four.
  387.         Polygon is created using current default surface and
  388.         will have 2 sides or be made with triangles if those
  389.         flags are set.
  390.  
  391.     ADD_CURVE(<point number list>, [ccstate])
  392.          -- Takes a variable number of point numbers as argument.
  393.         Curve is assigned current default surface.  Ccstate
  394.         gives the condition of the continuity control points
  395.         at the start and end.  If the ccstate argument 
  396.         contains 's', the first point in the list is a CC 
  397.         point.  If the string contains 'e', the same for the 
  398.         last point in list.
  399.  
  400.     ADD_END()
  401.          -- Exit data creation mode.  New data will appear in the
  402.         layer at this time and the whole operation can be
  403.         undone as an atomic command.
  404.  
  405.  
  406. Point Transform (TRANSFORM mode):
  407.  
  408.     n<number> = XFRM_BEGIN()
  409.          -- Start a point transformation.  Returns number of points in
  410.         the current layer.  If the number returned is zero, there
  411.         are no points to process and TRANSFORM mode is not entered.
  412.  
  413.     pos<vector> = XFRM_GETPOS(index<number>)
  414.          -- Get position of indexed point.  Index is from 1 to N. 
  415.  
  416.     XFRM_SETPOS(index<number>, position<vector>)
  417.          -- Move the indexed point to a new position.
  418.  
  419.     XFRM_END()
  420.          -- Complete the transform and move all the points to their
  421.         new positions.  END_ALL aborts the transform.
  422.  
  423.  
  424. Sweep and Copy (REPLICATE mode):
  425.  
  426.     REPL_BEGIN(mode<COPY|SWEEP>)
  427.          -- Start replication.  This is a copy or sweep, given by
  428.         the argument.
  429.  
  430.     REPL_STEP(offset<vector>, scale<vector>, rotation<vector>,
  431.           [center<vector>])
  432.          -- Set the next step of the replication.  Offset is a shift.
  433.         Rotation is a vector of (H,P,B) which is rotation around
  434.         the Y, X and Z axes, respectively.  Rotation and scaling
  435.         will occur around optional center.  To get a first step 
  436.         that is the same as the start pattern, REPL_STEP(0,1,0) 
  437.         must be included in the sequence.
  438.  
  439.     REPL_END()
  440.          -- Complete the replication creating new data.  END_ALL can be
  441.         used to abort the operation.
  442.  
  443.  
  444. Selection:
  445.  
  446. Selection can be in two modes.  In the GLOBAL mode, all points and polygons
  447. in active layers are selected for operation.  This is the default selection 
  448. mode.  In USER mode, the selection set in the main window is honored by
  449. rexx functions.  This selection can also be altered.
  450.  
  451.     SEL_MODE(newmode<GLOBAL|USER>)
  452.          --    Set the selection mode.  END_ALL or script termination 
  453.         will reset this mode to GLOBAL.
  454.  
  455.     SEL_POINT(action<SET|CLEAR>, [condition ...])
  456.          --    Modify point selection.  Only valid in USER mode, and
  457.         the user's selection mode will be changed to point if
  458.         it is not already.  If there is no condition, the 
  459.         action will apply to all points.  Otherwise, the points 
  460.         specified by the condition will be added to the 
  461.         selection for SET and removed from the selection for 
  462.         CLEAR.  The possible conditions with their additional 
  463.         arguements are:
  464.  
  465.         VOLUME, lo<vector>, hi<vector>
  466.              -- points within the volume.
  467.  
  468.         CONNECT
  469.              -- points connected to already selected ones.  Only
  470.             works with SET.
  471.  
  472.         NPEQ, npol<number>
  473.              --    points belonging to exactly npol polygons.
  474.  
  475.         NPLT, npol<number>
  476.              --    points belonging to less than npol polygons.
  477.  
  478.         NPGT, npol<number>
  479.              --    points belonging to more than npol polygons.
  480.  
  481.     SEL_POLYGON(action<SET|CLEAR>, [condition ...])
  482.          --    Modify polygon selection.  Like SEL_POINT, with the
  483.         following conditions:
  484.  
  485.         VOLEXCL, lo<vector>, hi<vector>
  486.              -- polygons entirely within the volume.
  487.  
  488.         VOLINCL, lo<vector>, hi<vector>
  489.              -- polygons at least partly within the volume.
  490.  
  491.         CONNECT
  492.              -- polygons connected to already selected ones.  Only
  493.             works with SET.
  494.  
  495.         NVEQ, nvert<number>
  496.              --    polygons with exactly nvert vertices.
  497.  
  498.         NVLT, nvert<number>
  499.              --    polygons with less than nvert vertices.
  500.  
  501.         NVGT, nvert<number>
  502.              --    polygons with greater than nvert vertices.
  503.  
  504.         SURFACE, surface<string>
  505.              -- polygons having the given surface.
  506.  
  507.         FACE
  508.              -- face polygons only.
  509.  
  510.         CURVE
  511.              -- curve polygons only.
  512.  
  513.         NONPLANAR, [limit<number>]
  514.              -- polygons less planar than the given limit.  If
  515.             limit is omitted, it is the user's default limit.
  516.  
  517. (new)    SEL_INVERT()
  518.          -- Invert selection.  Selected becomes unselected and visa
  519.         versa.
  520.  
  521. (new)    SEL_HIDE(state<SELECTED|UNSELECTED>)
  522.          -- Hide all selected or unselected data.  Default is SELECTED.
  523.  
  524. (new)    SEL_UNHIDE()
  525.          -- Unhide all hiden data.
  526.  
  527.  
  528. User Interface:
  529.  
  530.     ok<bool> = NOTIFY(type<number>, line1<string>, [line2, ...])
  531.          -- Puts up a simple notification requester and returns user
  532.         choice if one given.  Type is 1 for simple OK only
  533.         notification and the function always returns 1.  Type 2
  534.         is OK/Cancel request and function returns 1 for OK, 0
  535.         for Cancel.  Type 3 is Yes/No request and the function
  536.         returns 1 for Yes.  The remaining arguments are text 
  537.         lines, which will be in the default color unless preceded 
  538.         by '@' or '!' for increasingly strong emphasis colors.
  539.  
  540.     fnam<string> = GETFILENAME(title<string>, dir<string>, [nam<string>])
  541.          -- Get a filename from the user.  Title is the title text
  542.         for the file requester.  Dir is the start directory and
  543.         nam is the optional name to start with in that directory.
  544.         The return value is a name plus a path which clients will
  545.         have to parse themselves if they want parts of the name.
  546.         The string "(none)" is returned if the user cancels.
  547.  
  548. A client ARexx macro can put up a requester to get input from the user.
  549. The interface is a set of functions to set up the request and get the 
  550. user's responses.
  551.  
  552.     REQ_BEGIN(header<string>)
  553.          -- Start a requester box interaction.  The requester box will
  554.         have the given header string at the top.
  555.  
  556.     id = REQ_ADDCONTROL(label<string>, type<string>, [opts, ...])
  557.          -- Add a user input control with the given label text and
  558.         description.  The type is a code for the type of control
  559.         to create, and subsequent arguments are provided 
  560.         depending on type.
  561.  
  562.         type           code   other args
  563.         ----           ----   ----------
  564.         string        S     width (number of characters)
  565.         number        N     units (flag for meters(1) or unitless(0))
  566.         vector        V     units
  567.         v-choice    CV    text1 text2 text3 ...
  568.         h-choice    CH    ...
  569.         boolean        B
  570.         text-line    T     line1, line2, ...
  571.         surface        R
  572.         font        F
  573.  
  574.         Controls must be all added before any attempt to set or
  575.         get values, or to post.
  576.  
  577.     REQ_SETVAL(id, value ...)
  578.          -- Set the value of the control.  Interpretation of value
  579.         argument(s) depends on control type.  Text-line controls
  580.         have no value.
  581.  
  582.         type      value args
  583.         ----      ----------
  584.         string      text<string>
  585.         number      value<number>, [default<number>]
  586.         vector      value<vector>, [default<number>]
  587.         choice      index<number 1..N>
  588.         boolean      state<bool>
  589.         surface      name<string>
  590.         font      index<number 1..fontcount()>
  591.  
  592.     ok<bool> = REQ_POST()
  593.          -- Posts request box and returns 1 for Ok, 0 for Cancel.
  594.  
  595.     value = REQ_GETVAL(id)
  596.          -- Get the value of the control.  Interpretation of the
  597.         value string depends on the type of the control.  Values
  598.         are as they are in SETVAL, with vectors always returned 
  599.         as a triple.
  600.  
  601.     REQ_END()
  602.          -- Complete requester interaction.  Each request must be
  603.         complete before the next begins.
  604.  
  605. A client ARexx macro can configure the custom ARexx commands available
  606. to the interactive user.
  607.  
  608.     ok<bool> = RXCMD_ADD(name<string>, cmd<string>)
  609.          -- Add the given command string to the interface with the
  610.         given descriptive name.  Returns true if item could
  611.         be added.
  612.  
  613.     RXCMD_REMOVE(name<string>)
  614.          -- Remove the command from interface given its descriptive
  615.         name.
  616.  
  617.     cmd<string> = RXFUN_GET(n<number>)
  618.          -- Get the command string for function key n (1..10).
  619.  
  620.     RXFUN_SET(n<number>, cmd<string>)
  621.          -- Set the command string for function key n (1..10).  Since
  622.         any change made here will be saved in the config file, 
  623.         scripts that do this should probably restore the old 
  624.         command before exiting.
  625.  
  626.  
  627. A macro can show how it is progressing through the stages of an operation
  628. with the progress meter.  Metering is a state that can co-exist with any
  629. mode or with a requester.
  630.  
  631.     METER_BEGIN(count<int>, header<string>, [footer<string>])
  632.          -- Initiate progress meter with the given main header and
  633.         optional footer.  The count is the number of times
  634.         METER_STEP() will be called before operation is done.
  635.  
  636.     METER_STEP()
  637.          -- Step the progress meter one step closer to completion.
  638.         Will return an error if the initial count is exceeded,
  639.         or if the user requests an abort.
  640.  
  641.     METER_END()
  642.          -- Deactivate meter.  Can be called before process final
  643.         count is reached.
  644.